package com.atwulidun.visitor14;
// 定义一个访问者抽象类
// 不定义成接口的原因：用接口类型接收其实现类对象，该实现类对象不能转型为其对应类的对象，那么boss的showTotalIncome和showTotalConsumption方法就不能调用了
public abstract class AccountBookViewer {
    // 有多少种类型的Bill，访问者里就应该对应多少种view方法，入参对应不同类型的Bill
    public abstract void view(IncomeBill incomeBill);
    public abstract void view(ConsumptionBill consumptionBill);
}

// 具体的访问者类
// 老板
class Boss extends AccountBookViewer {
    // 老板只关心总的支出和总的收入
    private double totalIncome;
    private double totalConsumption;

    @Override
    public void view(IncomeBill incomeBill) {
        // 每访问一个收入账单，都将其金额加到总收入里
        totalIncome += incomeBill.getAmount();
    }

    @Override
    public void view(ConsumptionBill consumptionBill) {
        // 每访问一个支出账单，都将其金额加入到总支出里
        totalConsumption += consumptionBill.getAmount();
    }

    // 输出总支出和总收入的方法
    public void showTotalIncome() {
        System.out.println("老板关心的总收入为：" + totalIncome);
    }

    public void showTotalConsumption() {
        System.out.println("老板关心的总支出为：" + totalConsumption);
    }
}

// 会计
class CPA extends AccountBookViewer {
    // 会计关心收入纳税了没有
    @Override
    public void view(IncomeBill incomeBill) {
        System.out.println("查看收入是否已经纳税");
    }
    // 会计关心给员工发工资扣税了没
    @Override
    public void view(ConsumptionBill consumptionBill) {
        if ("工资".equals(consumptionBill.getDes())) {
            System.out.println("查看工资是否已经扣税");
        }
    }
}